//package net.jsoft.platform.core.util.json;
//
//import java.beans.IntrospectionException;
//import java.beans.Introspector;
//import java.beans.PropertyDescriptor;
//import java.math.BigDecimal;
//import java.math.BigInteger;
//import java.text.CharacterIterator;
//import java.text.SimpleDateFormat;
//import java.text.StringCharacterIterator;
//import java.util.ArrayList;
//import java.util.Collection;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.HashSet;
//import java.util.Iterator;
//import java.util.List;
//import java.util.Map;
//import java.util.Map.Entry;
//import java.util.Set;
//
//import net.sf.ezmorph.object.DateMorpher;
//import net.sf.json.JSONArray;
//import net.sf.json.JSONObject;
//import net.sf.json.JsonConfig;
//import net.sf.json.processors.JsonValueProcessor;
//import net.sf.json.util.JSONUtils;
//
//
//
//@SuppressWarnings({ "rawtypes", "unchecked" })
//public class JsonUtils
//{
//    private CharacterIterator it;
//    private char c;
//    private int col;
//
//    /**
//     * 验证一个字符串是否是合法的JSON串
//     *
//     * @param input
//     *            要验证的字符串
//     * @return true-合法 ，false-非法
//     */
//    public boolean validate(String input)
//    {
//        input = input.trim();
//        boolean ret = valid(input);
//        return ret;
//    }
//
//    private boolean valid(String input)
//    {
//        if ("".equals(input))
//            return true;
//
//        boolean ret = true;
//        it = new StringCharacterIterator(input);
//        c = it.first();
//        col = 1;
//        if (!value())
//        {
//            ret = error("value", 1);
//        } else
//        {
//            skipWhiteSpace();
//            if (c != CharacterIterator.DONE)
//            {
//                ret = error("end", col);
//            }
//        }
//
//        return ret;
//    }
//
//    private boolean value()
//    {
//        return literal("true") || literal("false") || literal("null") || string() || number() || object() || array();
//    }
//
//    private boolean literal(String text)
//    {
//        CharacterIterator ci = new StringCharacterIterator(text);
//        char t = ci.first();
//        if (c != t)
//            return false;
//
//        int start = col;
//        boolean ret = true;
//        for (t = ci.next(); t != CharacterIterator.DONE; t = ci.next())
//        {
//            if (t != nextCharacter())
//            {
//                ret = false;
//                break;
//            }
//        }
//        nextCharacter();
//        if (!ret)
//            error("literal " + text, start);
//        return ret;
//    }
//
//    private boolean array()
//    {
//        return aggregate('[', ']', false);
//    }
//
//    private boolean object()
//    {
//        return aggregate('{', '}', true);
//    }
//
//    private boolean aggregate(char entryCharacter, char exitCharacter, boolean prefix)
//    {
//        if (c != entryCharacter)
//            return false;
//        nextCharacter();
//        skipWhiteSpace();
//        if (c == exitCharacter)
//        {
//            nextCharacter();
//            return true;
//        }
//
//        for (;;)
//        {
//            if (prefix)
//            {
//                int start = col;
//                if (!string())
//                    return error("string", start);
//                skipWhiteSpace();
//                if (c != ':')
//                    return error("colon", col);
//                nextCharacter();
//                skipWhiteSpace();
//            }
//            if (value())
//            {
//                skipWhiteSpace();
//                if (c == ',')
//                {
//                    nextCharacter();
//                } else if (c == exitCharacter)
//                {
//                    break;
//                } else
//                {
//                    return error("comma or " + exitCharacter, col);
//                }
//            } else
//            {
//                return error("value", col);
//            }
//            skipWhiteSpace();
//        }
//
//        nextCharacter();
//        return true;
//    }
//
//    private boolean number()
//    {
//        if (!Character.isDigit(c) && c != '-')
//            return false;
//        int start = col;
//        if (c == '-')
//            nextCharacter();
//        if (c == '0')
//        {
//            nextCharacter();
//        } else if (Character.isDigit(c))
//        {
//            while (Character.isDigit(c))
//                nextCharacter();
//        } else
//        {
//            return error("number", start);
//        }
//        if (c == '.')
//        {
//            nextCharacter();
//            if (Character.isDigit(c))
//            {
//                while (Character.isDigit(c))
//                    nextCharacter();
//            } else
//            {
//                return error("number", start);
//            }
//        }
//        if (c == 'e' || c == 'E')
//        {
//            nextCharacter();
//            if (c == '+' || c == '-')
//            {
//                nextCharacter();
//            }
//            if (Character.isDigit(c))
//            {
//                while (Character.isDigit(c))
//                    nextCharacter();
//            } else
//            {
//                return error("number", start);
//            }
//        }
//        return true;
//    }
//
//    private boolean string()
//    {
//        if (c != '"')
//            return false;
//
//        int start = col;
//        boolean escaped = false;
//        for (nextCharacter(); c != CharacterIterator.DONE; nextCharacter())
//        {
//            if (!escaped && c == '\\')
//            {
//                escaped = true;
//            } else if (escaped)
//            {
//                if (!escape())
//                {
//                    return false;
//                }
//                escaped = false;
//            } else if (c == '"')
//            {
//                nextCharacter();
//                return true;
//            }
//        }
//        return error("quoted string", start);
//    }
//
//    private boolean escape()
//    {
//        int start = col - 1;
//        if (" \\\"/bfnrtu".indexOf(c) < 0)
//        {
//            return error("escape sequence  \\\",\\\\,\\/,\\b,\\f,\\n,\\r,\\t  or  \\uxxxx ", start);
//        }
//        if (c == 'u')
//        {
//            if (!ishex(nextCharacter()) || !ishex(nextCharacter()) || !ishex(nextCharacter()) || !ishex(nextCharacter()))
//            {
//                return error("unicode escape sequence  \\uxxxx ", start);
//            }
//        }
//        return true;
//    }
//
//    private boolean ishex(char d)
//    {
//        return "0123456789abcdefABCDEF".indexOf(c) >= 0;
//    }
//
//    private char nextCharacter()
//    {
//        c = it.next();
//        ++col;
//        return c;
//    }
//
//    private void skipWhiteSpace()
//    {
//        while (Character.isWhitespace(c))
//        {
//            nextCharacter();
//        }
//    }
//
//    private boolean error(String type, int col)
//    {
//        System.out.printf("type: %s, col: %s%s", type, col, System.getProperty("line.separator"));
//        return false;
//    }
//
//    /** 页面传至后台时，json数据在request的参数名称 */
//    public final static String JSON_ATTRIBUTE = "json";
//
//    public final static String JSON_ATTRIBUTE1 = "json1";
//
//    public final static String JSON_ATTRIBUTE2 = "json2";
//
//    public final static String JSON_ATTRIBUTE3 = "json3";
//
//    public final static String JSON_ATTRIBUTE4 = "json4";
//
//    /**
//     * 从一个JSON 对象字符格式中得到一个java对象，形如： {"id" : idValue, "name" : nameValue,
//     * "aBean" : {"aBeanId" : aBeanIdValue, ...}}
//     * 
//     * @param object
//     * @param clazz
//     * @return
//     */
//
//    public static Object getDTO(String jsonString, Class clazz)
//    {
//        JSONObject jsonObject = null;
//        try
//        {
//            setDataFormat2JAVA();
//            jsonObject = JSONObject.fromObject(jsonString);
//        } catch (Exception e)
//        {
//            e.printStackTrace();
//        }
//        return JSONObject.toBean(jsonObject, clazz);
//    }
//
//    /**
//     * 从一个JSON 对象字符格式中得到一个java对象，其中beansList是一类的集合，形如： {"id" : idValue, "name" :
//     * nameValue, "aBean" : {"aBeanId" : aBeanIdValue, ...}, beansList:[{}, {},
//     * ...]}
//     * 
//     * @param jsonString
//     * @param clazz
//     * @param map
//     *            集合属性的类型 (key : 集合属性名, value : 集合属性类型class) eg: ("beansList" :
//     *            Bean.class)
//     * @return
//     */
//    public static Object getDTO(String jsonString, Class clazz, Map map)
//    {
//        JSONObject jsonObject = null;
//        try
//        {
//            setDataFormat2JAVA();
//            jsonObject = JSONObject.fromObject(jsonString);
//        } catch (Exception e)
//        {
//            e.printStackTrace();
//        }
//        return JSONObject.toBean(jsonObject, clazz, map);
//    }
//
//    /**
//     * 从一个JSON数组得到一个java对象数组，形如： [{"id" : idValue, "name" : nameValue}, {"id" :
//     * idValue, "name" : nameValue}, ...]
//     * 
//     * @param object
//     * @param clazz
//     * @return
//     */
//    public static Object[] getDTOArray(String jsonString, Class clazz)
//    {
//        setDataFormat2JAVA();
//        JSONArray array = JSONArray.fromObject(jsonString);
//        Object[] obj = new Object[array.size()];
//        for (int i = 0; i < array.size(); i++)
//        {
//            JSONObject jsonObject = array.getJSONObject(i);
//            obj[i] = JSONObject.toBean(jsonObject, clazz);
//        }
//        return obj;
//    }
//
//    /**
//     * 从一个JSON数组得到一个java对象数组，形如： [{"id" : idValue, "name" : nameValue}, {"id" :
//     * idValue, "name" : nameValue}, ...]
//     * 
//     * @param object
//     * @param clazz
//     * @param map
//     * @return
//     */
//    public static Object[] getDTOArray(String jsonString, Class clazz, Map map)
//    {
//        setDataFormat2JAVA();
//        JSONArray array = JSONArray.fromObject(jsonString);
//        Object[] obj = new Object[array.size()];
//        for (int i = 0; i < array.size(); i++)
//        {
//            JSONObject jsonObject = array.getJSONObject(i);
//            obj[i] = JSONObject.toBean(jsonObject, clazz, map);
//        }
//        return obj;
//    }
//
//    /**
//     * 从一个JSON数组得到一个java对象集合
//     * 
//     * @param object
//     * @param clazz
//     * @return
//     */
//    public static Set getDTOSet(String jsonString, Class clazz)
//    {
//        setDataFormat2JAVA();
//        JSONArray array = JSONArray.fromObject(jsonString);
//        Set set = new HashSet();
//        for (Iterator iter = array.iterator(); iter.hasNext();)
//        {
//            JSONObject jsonObject = (JSONObject) iter.next();
//            set.add(JSONObject.toBean(jsonObject, clazz));
//        }
//        return set;
//    }
//
//    /**
//     * 从一个JSON数组得到一个java对象集合
//     * 
//     * @param object
//     * @param clazz
//     * @return
//     */
//
//    public static List getDTOList(String jsonString, Class clazz)
//    {
//        setDataFormat2JAVA();
//        JSONArray array = JSONArray.fromObject(jsonString);
//        List list = new ArrayList();
//        for (Iterator iter = array.iterator(); iter.hasNext();)
//        {
//            JSONObject jsonObject = (JSONObject) iter.next();
//            list.add(JSONObject.toBean(jsonObject, clazz));
//        }
//        return list;
//    }
//
//    /**
//     * 从一个JSON数组得到一个java对象集合，其中对象中包含有集合属性
//     * 
//     * @param object
//     * @param clazz
//     * @param map
//     *            集合属性的类型
//     * @return
//     */
//    public static List getDTOList(String jsonString, Class clazz, Map map)
//    {
//        setDataFormat2JAVA();
//        JSONArray array = JSONArray.fromObject(jsonString);
//        List list = new ArrayList();
//        for (Iterator iter = array.iterator(); iter.hasNext();)
//        {
//            JSONObject jsonObject = (JSONObject) iter.next();
//            list.add(JSONObject.toBean(jsonObject, clazz, map));
//        }
//        return list;
//    }
//
//    /**
//     * 从json HASH表达式中获取一个map，该map支持嵌套功能 形如：{"id" : "johncon", "name" : "小强"}
//     * 注意commons-collections版本，必须包含org.apache.commons.collections.map.
//     * MultiKeyMap
//     * 
//     * @param object
//     * @return
//     */
//    public static Map getMapFromJson(String jsonString)
//    {
//        setDataFormat2JAVA();
//        JSONObject jsonObject = JSONObject.fromObject(jsonString);
//        Map map = new HashMap();
//        for (Iterator iter = jsonObject.keys(); iter.hasNext();)
//        {
//            String key = (String) iter.next();
//            map.put(key, jsonObject.get(key));
//        }
//        return map;
//    }
//
//    /**
//     * 从json数组中得到相应java数组 json形如：["123", "456"]
//     * 
//     * @param jsonString
//     * @return
//     */
//    public static Object[] getObjectArrayFromJson(String jsonString)
//    {
//        JSONArray jsonArray = JSONArray.fromObject(jsonString);
//        return jsonArray.toArray();
//    }
//
//    /**
//     * 把数据对象转换成json字符串 DTO对象形如：{"id" : idValue, "name" : nameValue, ...}
//     * 数组对象形如：[{}, {}, {}, ...] map对象形如：{key1 : {"id" : idValue, "name" :
//     * nameValue, ...}, key2 : {}, ...}
//     * 
//     * @param object
//     * @return
//     */
//    public static String getJSONString(Object object) throws Exception
//    {
//        String jsonString = null;
//        // 日期值处理器
//        JsonConfig jsonConfig = new JsonConfig();
//        jsonConfig.registerJsonValueProcessor(java.util.Date.class, new JsonDateValueProcessor());
//        if (object != null)
//        {
//            if (object instanceof Collection || object instanceof Object[])
//            {
//                jsonString = JSONArray.fromObject(object, jsonConfig).toString();
//            } else
//            {
//                jsonString = JSONObject.fromObject(object, jsonConfig).toString();
//            }
//        }
//        return jsonString == null ? "{}" : jsonString;
//    }
//
//    // 设定日期转换格式
//    private static void setDataFormat2JAVA()
//    {
//
//        JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(new String[] { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss" }));
//    }
//
//    public static String object2json(Object obj) throws Exception
//    {
//        StringBuilder json = new StringBuilder();
//        if (obj == null)
//        {
//            json.append("\"\"");
//        } else if (obj instanceof String || obj instanceof Integer || obj instanceof Float || obj instanceof Boolean || obj instanceof Short || obj instanceof Double || obj instanceof Long || obj instanceof BigDecimal || obj instanceof BigInteger || obj instanceof Byte)
//        {
//            json.append("\"").append(string2json(obj.toString())).append("\"");
//        } else if (obj instanceof Object[])
//        {
//            json.append(array2json((Object[]) obj));
//        } else if (obj instanceof List)
//        {
//            json.append(list2json((List<?>) obj));
//        } else if (obj instanceof Map)
//        {
//            json.append(map2json((Map<?, ?>) obj));
//        } else if (obj instanceof Set)
//        {
//            json.append(set2json((Set<?>) obj));
//        } else if (obj instanceof Date)
//        {
//            json.append(set2json((Set<?>) obj));
//        } else
//        {
//            json.append(getJSONString(obj));
//        }
//        return json.toString();
//    }
//
//    public static String bean2json(Object bean)
//    {
//        StringBuilder json = new StringBuilder();
//        json.append("{");
//        PropertyDescriptor[] props = null;
//        try
//        {
//            props = Introspector.getBeanInfo(bean.getClass(), Object.class).getPropertyDescriptors();
//        } catch (IntrospectionException e)
//        {
//        }
//        if (props != null)
//        {
//            for (int i = 0; i < props.length; i++)
//            {
//                try
//                {
//                    String name = object2json(props[i].getName());
//                    String value = object2json(props[i].getReadMethod().invoke(bean));
//                    json.append(name);
//                    json.append(":");
//                    json.append(value);
//                    json.append(",");
//                } catch (Exception e)
//                {
//                    e.printStackTrace();
//                }
//            }
//            json.setCharAt(json.length() - 1, '}');
//        } else
//        {
//            json.append("}");
//        }
//        return json.toString();
//    }
//
//    public static String list2json(List<?> list) throws Exception
//    {
//        StringBuilder json = new StringBuilder();
//        json.append("[");
//        if (list != null && list.size() > 0)
//        {
//            for (Object obj : list)
//            {
//                json.append(object2json(obj));
//                json.append(",");
//            }
//            json.setCharAt(json.length() - 1, ']');
//        } else
//        {
//            json.append("]");
//        }
//        return json.toString();
//    }
//
//    public static String array2json(Object[] array) throws Exception
//    {
//        StringBuilder json = new StringBuilder();
//        json.append("[");
//        if (array != null && array.length > 0)
//        {
//            for (Object obj : array)
//            {
//                json.append(object2json(obj));
//                json.append(",");
//            }
//            json.setCharAt(json.length() - 1, ']');
//        } else
//        {
//            json.append("]");
//        }
//        return json.toString();
//    }
//
//    public static String map2json(Map<?, ?> map) throws Exception
//    {
//        StringBuilder json = new StringBuilder();
//        json.append("{");
//        if (map != null && map.size() > 0)
//        {
//            for (Entry<?, ?> m : map.entrySet())
//            {
//                json.append(object2json(m.getKey()));
//                json.append(":");
//                json.append(object2json(m.getValue()));
//                json.append(",");
//            }
//            json.setCharAt(json.length() - 1, '}');
//        } else
//        {
//            json.append("}");
//        }
//        return json.toString();
//    }
//
//    public static String set2json(Set<?> set) throws Exception
//    {
//        StringBuilder json = new StringBuilder();
//        json.append("[");
//        if (set != null && set.size() > 0)
//        {
//            for (Object obj : set)
//            {
//                json.append(object2json(obj));
//                json.append(",");
//            }
//            json.setCharAt(json.length() - 1, ']');
//        } else
//        {
//            json.append("]");
//        }
//        return json.toString();
//    }
//
//    public static String string2json(String s)
//    {
//        if (s == null)
//            return "";
//        StringBuilder sb = new StringBuilder();
//        for (int i = 0; i < s.length(); i++)
//        {
//            char ch = s.charAt(i);
//            switch (ch)
//            {
//            case '"':
//                sb.append("\\\"");
//                break;
//            case '\\':
//                sb.append("\\\\");
//                break;
//            case '\b':
//                sb.append("\\b");
//                break;
//            case '\f':
//                sb.append("\\f");
//                break;
//            case '\n':
//                sb.append("\\n");
//                break;
//            case '\r':
//                sb.append("\\r");
//                break;
//            case '\t':
//                sb.append("\\t");
//                break;
//            case '/':
//                sb.append("\\/");
//                break;
//            default:
//                if (ch >= '\u0000' && ch <= '\u001F')
//                {
//                    String ss = Integer.toHexString(ch);
//                    sb.append("\\u");
//                    for (int k = 0; k < 4 - ss.length(); k++)
//                    {
//                        sb.append('0');
//                    }
//                    sb.append(ss.toUpperCase());
//                } else
//                {
//                    sb.append(ch);
//                }
//            }
//        }
//        return sb.toString();
//    }
//
//    public static void main(String[] args)
//    {
//        String jsonStr = "[{\"website\":\"oschina.net\"}]";
//        System.out.println(jsonStr + ":" + new JsonUtils().validate(jsonStr));
//    }
//
//}
//
//class JsonDateValueProcessor implements JsonValueProcessor
//{
//    private String format = "yyyy-MM-dd";
//
//    /**
//     * Created on Feb 25, 2010
//     * <p>
//     * Discription:[方法功能中文描述]
//     * </p>
//     * 
//     * @author: 赵继平[rocccp@sohu.com]
//     * @update:[日期YYYY-MM-DD] [更改人姓名]
//     */
//    public Object processArrayValue(Object value, JsonConfig jcf)
//    {
//        String[] obj = {};
//        if (value instanceof Date[])
//        {
//            SimpleDateFormat sdf = new SimpleDateFormat(format);
//            Date[] dates = (Date[]) value;
//            obj = new String[dates.length];
//            for (int i = 0; i < dates.length; i++)
//            {
//                obj[i] = sdf.format(dates[i]).trim();
//            }
//        }
//        return obj;
//    }
//
//    /**
//     * Created on Feb 25, 2010
//     * <p>
//     * Discription:[方法功能中文描述]
//     * </p>
//     * 
//     * @author: 赵继平[rocccp@sohu.com]
//     * @update:[日期YYYY-MM-DD] [更改人姓名]
//     */
//    public Object processObjectValue(String key, Object value, JsonConfig jcf)
//    {
//        if (value instanceof Date)
//        {
//            String str = new SimpleDateFormat(format).format((Date) value);
//            return str.trim();
//        }
//        return value == null ? null : value.toString();
//    }
//}
